import puppeteer from "puppeteer";
import { Readability } from "@mozilla/readability";
import { JSDOM } from "jsdom";

export async function webToPdf(url, options) {
  console.log("url", url);

  const { dir, fileName } = {
    dir: "output",
    ...options,
  };

  // 启动浏览器
  const browser = await puppeteer.launch({
    userDataDir: "./user-data", // 使用用户数据目录持久化缓存
    headless: true,
  });

  // 打开新页面
  const page = await browser.newPage();

  // 导航到目标网页
  await page.goto(url, {
    // waitUntil: "networkidle", // 500毫秒内无请求
    waitUntil: "networkidle2", // 等待网络空闲
    timeout: 120 * 1000,
  });

  // await page.waitForTimeout(1000);

  // await page.waitForNetworkIdle({ idleTime: 2000 }); // 等待1秒无网络活动

  // 获取标题文本
  // const title = await page.evaluate(() => {
  //   const titleElement = document.querySelector("#sbTitle");
  //   const title = titleElement ? titleElement.textContent.trim() : null;
  //   document.querySelector(".main-header").remove();

  //   // post_detail插入h1标题
  //   const h1Element = document.createElement("h1");
  //   h1Element.textContent = title;
  //   document.querySelector(".postBody").prepend(h1Element);

  //   return title;
  // });

  // 删除多余html
  await page.evaluate(() => {
    [
      "#footer",
      ".essaySuffix-box",
      "#blog_post_info",
      "#blog_post_info_block",
      ".postDesc",
      "#comment_form",
    ].forEach((selector) => document.querySelector(selector)?.remove());
  });

  // 生成文件名（移除非法字符）
  // const fileName =
  //   `${index}` - title
  //     ? `${title.replace(/[\\/:*?"<>|]/g, "")}.pdf` // 移除文件名非法字符
  //     : "";

  // 在页面中执行 jQuery 代码
  await page.evaluate(() => {
    const codeElements = document.querySelectorAll(".cnblogs_code");
    codeElements.forEach((element) => {
      const textContent = element.textContent; // 获取纯文本内容
      element.innerHTML = `${textContent}`; // 替换为纯文本
    });
  });

  const path = `${dir}/${fileName}`;
  console.log("生成 PDF", path);

  // 生成 PDF
  await page.pdf({
    path, // 输出文件名
    format: "A4", // 纸张格式
    printBackground: true, // 打印背景颜色和图像
  });

  // 关闭浏览器
  await browser.close();
}

export async function pure(url, dir = "output", defaultPath) {
  // 启动浏览器
  const browser = await puppeteer.launch();

  // 打开新页面
  const page = await browser.newPage();

  // 导航到目标网页
  await page.goto(url, {
    waitUntil: "networkidle2", // 等待网络空闲
  });

  // 获取标题文本
  const article = await page.evaluate(() => {
    const titleElement = document.querySelector("#sbTitle");
    const title = titleElement ? titleElement.textContent.trim() : null;
    const contentElement = document.querySelector("#cnblogs_post_body");
    const content = contentElement ? contentElement.innerHTML.trim() : null;

    return {
      title,
      content,
    };
  });

  await page.evaluate((article) => {
    document.head.innerHTML = `
      <meta charset="UTF-8">
      <title>${article.title}</title>
      <style>
        body {
          max-width: 800px;
          margin: 0 auto;
          padding: 20px;
          font-family: Georgia, serif;
          font-size: 18px;
          line-height: 1.6;
          color: #333;
          background: #f9f9f9;
        }
        h1, h2, h3 {
          line-height: 1.3;
          color: #222;
        }
        img {
          max-width: 100%;
          height: auto;
        }
      </style>
    `;

    document.body.innerHTML = `
      <h1>${article.title}</h1>
      <div id="content">${article.content}</div>
    `;
  }, article);

  // 生成文件名（移除非法字符）
  const fileName = article.title
    ? `${article.title.replace(/[\\/:*?"<>|]/g, "")}.pdf` // 移除文件名非法字符
    : defaultPath;

  // 生成 PDF
  await page.pdf({
    path: `${dir}/${fileName}`, // 输出文件名
    format: "A4", // 纸张格式
    printBackground: true, // 打印背景颜色和图像
  });

  console.log("生成 PDF");

  // 关闭浏览器
  await browser.close();
}

//  阅读模式转换
export async function convertToReadingMode(url) {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  await page.goto(url);

  // 1. 使用Readability提取内容
  const html = await page.evaluate(() => {
    return document.documentElement.innerHTML;
  });
  var doc = new JSDOM(html);

  const reader = new Readability(doc.window.document);
  const article = reader.parse();

  console.log("article", article);

  // 2. 创建干净的阅读模式页面
  await page.evaluate((article) => {
    document.head.innerHTML = `
      <meta charset="UTF-8">
      <title>${article.title}</title>
      <style>
        body {
          max-width: 800px;
          margin: 0 auto;
          padding: 20px;
          font-family: Georgia, serif;
          font-size: 18px;
          line-height: 1.6;
          color: #333;
          background: #f9f9f9;
        }
        h1, h2, h3 {
          line-height: 1.3;
          color: #222;
        }
        img {
          max-width: 100%;
          height: auto;
        }
      </style>
    `;

    document.body.innerHTML = `
      <h1>${article.title}</h1>
      <div id="content">${article.content}</div>
    `;
  }, article);

  // 3. 可选：保存为PDF
  await page.pdf({ path: "article.pdf", format: "A4" });

  await browser.close();
}
